package ace.cmp.spring.data.jdbc.querydsl.core.repository.handler;

import com.querydsl.core.types.Expression;
import com.querydsl.sql.dml.SQLInsertClause;
import com.querydsl.sql.dml.SQLUpdateClause;

/**
 * @author caspar
 * @date 2024/6/26 16:03 逻辑删除注解处理器
 */
public interface QuerydslLogicDeleteAnnotationHandler {

  /**
   * insert数据时候,处理逻辑删除框架注解 {@link ace.cmp.spring.data.jdbc.querydsl.core.annotations.LogicDelete }
   *
   * @param entity                 实体
   * @param sqlClause              sql脚本
   * @param enableLogicDeleteForce 是否强制使用框架值
   */
  void processInsert(Object entity, SQLInsertClause sqlClause, boolean enableLogicDeleteForce);

  /**
   * delete数据时候,处理逻辑删除框架注解 {@link ace.cmp.spring.data.jdbc.querydsl.core.annotations.LogicDelete }
   *
   * @param idExpression 实体id sql表达式
   * @param entityClass  实体对象类型
   * @param sqlClause    sql脚本集
   */
  void processLogicDelete(Expression idExpression, Class entityClass, SQLUpdateClause sqlClause);

  /**
   * delete数据时候,处理逻辑删除框架注解 {@link ace.cmp.spring.data.jdbc.querydsl.core.annotations.LogicDelete }
   *
   * @param entity                 实体
   * @param sqlClause              sql脚本
   * @param enableLogicDeleteForce 是否强制使用框架值
   */
  void processUpdate(Object entity, SQLUpdateClause sqlClause, boolean enableLogicDeleteForce);
}
